package com.wujunshen.dumpling.core.engine;

import com.wujunshen.dumpling.database.metadata.model.Data;
import com.wujunshen.dumpling.common.constant.Constants;
import com.wujunshen.dumpling.common.utils.Assert;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.File;

/**
 * AbstractProduce
 *
 */
@Slf4j
@lombok.Data
public abstract class AbstractTemplateEngine {
  /** 模板配置 */
  private EngineConfig engineConfig;

  protected AbstractTemplateEngine(EngineConfig engineConfig) {
    Assert.isNotNull(engineConfig);
    this.engineConfig = engineConfig;
  }

  /**
   * 获取文件，文件名格式为，数据库名_版本号.文件类型
   *
   * @param docName 文档名称
   * @return {@link String}
   */
  protected File getFile(String docName) {
    File file;
    // 如果没有填写输出路径，默认当前项目路径下的doc目录
    if (StringUtils.isBlank(getEngineConfig().getFileOutputDir())) {
      String dir = System.getProperty("user.dir");
      file = new File(dir + "/doc");
    } else {
      file = new File(getEngineConfig().getFileOutputDir());
    }
    // 不存在创建
    if (!file.exists()) {
      // 创建文件夹
      file.mkdirs();
    }
    // 文件后缀
    String suffix = getEngineConfig().getFileType().getFileSuffix();
    file = new File(file, docName + suffix);
    // 设置文件产生位置
    getEngineConfig().setFileOutputDir(file.getParent());
    return file;
  }

  /** 打开文档生成的输出目录 */
  @SneakyThrows
  protected void openOutputDir() {
    // 是否打开，如果是就打开输出路径
    if (getEngineConfig().isOpenOutputDir()
        && StringUtils.isNotBlank(getEngineConfig().getFileOutputDir())) {
      // 获取系统信息
      String osName = System.getProperty("os.name");
      if (osName != null) {
        if (osName.contains(Constants.MAC)) {
          Runtime.getRuntime().exec("open " + getEngineConfig().getFileOutputDir());
        } else if (osName.contains(Constants.WINDOWS)) {
          Runtime.getRuntime().exec("cmd /c start " + getEngineConfig().getFileOutputDir());
        }
      }
    }
  }

  /**
   * 生成文档
   *
   * @param info {@link Data}
   * @param docName {@link String}
   */
  public abstract void produce(Data info, String docName);
}
